package bank;

import java.util.Date;

import exception.KontoNichtGedecktException;

public class Ueberweisung extends AbstractModel {

    private static final long serialVersionUID = 101L;

    public static final String PROPERTYNAME_VON_KONTO = "vonKonto";
    public static final String PROPERTYNAME_NACH_KONTO = "nachKonto";
    public static final String PROPERTYNAME_BETRAG = "betrag";
    public static final String PROPERTYNAME_DATUM = "datum";

	private Konto vonKonto;
	private Konto nachKonto;
	private double betrag;
	private Date datum;


	public Ueberweisung(Konto aVonKonto, Konto aNachKonto, double aBetrag, Date aDatum) {
	    setVonKonto(aVonKonto);
	    setNachKonto(aNachKonto);
	    setBetrag(aBetrag);
	    setDatum(aDatum);
	}

	public Konto getVonKonto() {
		return vonKonto;
	}

	public void setVonKonto(Konto aNewValue) {
	    if (aNewValue == null) {
	        throw new IllegalArgumentException("aNewValue darf nicht null sein!");
	    }
	    Konto oldValue = getVonKonto();
		vonKonto = aNewValue;
		firePropertyChange(PROPERTYNAME_VON_KONTO, oldValue, getVonKonto());
	}

	public Konto getNachKonto() {
		return nachKonto;
	}

	public void setNachKonto(Konto aNewValue) {
        if (aNewValue == null) {
            throw new IllegalArgumentException("aNewValue darf nicht null sein!");
        }
        Konto oldValue = getNachKonto();
        nachKonto = aNewValue;
        firePropertyChange(PROPERTYNAME_NACH_KONTO, oldValue, getNachKonto());
	}

	public double getBetrag() {
		return betrag;
	}

	public void setBetrag(double aNewValue) {
	    if (aNewValue <= 0) {
	        throw new IllegalArgumentException("aNewValue muss > 0 sein!");
	    }
	    double oldValue = getBetrag();
		betrag = aNewValue;
		firePropertyChange(PROPERTYNAME_BETRAG, oldValue, getBetrag());
	}

	public Date getDatum() {
		return datum;
	}

	public void setDatum(Date aNewValue) {
	    Date oldValue = getDatum();
        datum = aNewValue;
        firePropertyChange(PROPERTYNAME_DATUM, oldValue, getDatum());
	}

	public void durchfuehrenUeberweisung() throws KontoNichtGedecktException {
		vonKonto.auszahlen(betrag);
		nachKonto.einzahlen(betrag);
	}
}
